package com.github.link2fun.support.utils;

import cn.hutool.core.collection.CollectionUtil;
import com.github.link2fun.support.constant.CacheConstants;
import com.github.link2fun.support.core.domain.entity.SysDictData;
import com.github.link2fun.support.context.cache.service.RedisCache;
import org.noear.solon.Solon;

import java.util.List;

/**
 * 字典工具类
 *
 * @author link2fun
 */
@SuppressWarnings("unused")
public class DictUtils {
  /**
   * 分隔符
   */
  public static final String SEPARATOR = ",";


  /**
   * 设置字典缓存
   *
   * @param key          参数键
   * @param dictDataList 字典数据列表
   */
  public static void setDictCache(String key, List<SysDictData> dictDataList) {
    Solon.context().getBean(RedisCache.class).set(getCacheKey(key), dictDataList);
  }

  /**
   * 获取字典缓存
   *
   * @param key 参数键
   * @return dictDatas 字典数据列表
   */
  public static List<SysDictData> getDictCache(String key) {
    List<SysDictData> arrayCache = Solon.context().getBean(RedisCache.class).get(getCacheKey(key));
    if (StringUtils.isNotNull(arrayCache)) {
      return arrayCache;
    }
    return null;
  }

  /**
   * 根据字典类型和字典值获取字典标签
   *
   * @param dictType  字典类型
   * @param dictValue 字典值
   * @return 字典标签
   */
  public static String getDictLabel(String dictType, String dictValue) {
    return getDictLabel(dictType, dictValue, SEPARATOR);
  }

  /**
   * 根据字典类型和字典标签获取字典值
   *
   * @param dictType  字典类型
   * @param dictLabel 字典标签
   * @return 字典值
   */
  public static String getDictValue(String dictType, String dictLabel) {
    return getDictValue(dictType, dictLabel, SEPARATOR);
  }

  /**
   * 根据字典类型和字典值获取字典标签
   *
   * @param dictType  字典类型
   * @param dictValue 字典值
   * @param separator 分隔符
   * @return 字典标签
   */
  public static String getDictLabel(String dictType, String dictValue, String separator) {
    StringBuilder propertyString = new StringBuilder();
    List<SysDictData> datas = getDictCache(dictType);

    if (StringUtils.isNotNull(datas)) {
      if (StringUtils.containsAny(separator, dictValue)) {
        for (SysDictData dict : datas) {
          for (String value : dictValue.split(separator)) {
            if (value.equals(dict.getDictValue())) {
              propertyString.append(dict.getDictLabel()).append(separator);
              break;
            }
          }
        }
      } else {
        for (SysDictData dict : datas) {
          if (dictValue.equals(dict.getDictValue())) {
            return dict.getDictLabel();
          }
        }
      }
    }
    return StringUtils.stripEnd(propertyString.toString(), separator);
  }

  /**
   * 根据字典类型和字典标签获取字典值
   *
   * @param dictType  字典类型
   * @param dictLabel 字典标签
   * @param separator 分隔符
   * @return 字典值
   */
  public static String getDictValue(String dictType, String dictLabel, String separator) {
    StringBuilder propertyString = new StringBuilder();
    List<SysDictData> datas = getDictCache(dictType);
    if (CollectionUtil.isEmpty(datas)) {
      return StringUtils.EMPTY;
    }

    if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) {
      for (SysDictData dict : datas) {
        for (String label : dictLabel.split(separator)) {
          if (label.equals(dict.getDictLabel())) {
            propertyString.append(dict.getDictValue()).append(separator);
            break;
          }
        }
      }
    } else {
      for (SysDictData dict : datas) {
        if (dictLabel.equals(dict.getDictLabel())) {
          return dict.getDictValue();
        }
      }
    }
    return StringUtils.stripEnd(propertyString.toString(), separator);
  }

  /**
   * 删除指定字典缓存
   *
   * @param key 字典键
   */
  public static void removeDictCache(String key) {
    Solon.context().getBean(RedisCache.class).del(getCacheKey(key));
  }

  /**
   * 清空字典缓存
   */
  public static void clearDictCache() {
    final Iterable<String> keys = Solon.context().getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*");
    Solon.context().getBean(RedisCache.class).del(keys);
  }

  /**
   * 设置cache key
   *
   * @param configKey 参数键
   * @return 缓存键key
   */
  public static String getCacheKey(String configKey) {
    return CacheConstants.SYS_DICT_KEY + configKey;
  }
}
